/*
 * IdUniverso.h
 *
 *  Created on: 07/01/2010
 *      Author: San Martín, Matías I.
 */

#ifndef IDUNIVERSO_H_
#define IDUNIVERSO_H_

#include <string>
#include <sstream>

//TODO CAMBIAR DE LUGAR ESTO, EL MIDDLEWARE NO PUEDE DEPENDER DE LA APLICACION
#include "../../Aplicacion/Common/Mensajes/MensajesCommonTypes.h"

#include "CommonTypes.h"

using namespace middleware::common;
/**
 * Represeenta un identificador de universo dentro del sistema
 */
class IdUniverso {

//------------------------------ CONSTANTES ------------------------------
public:
	static const T_ID_UNIVERSO ID_UNDEFINED = -1;
//------------------------------ ATRIBUTOS ------------------------------
private:
	T_ID_UNIVERSO _id;

//------------------------------ METODOS ------------------------------
public:

	IdUniverso() :
		_id(ID_UNDEFINED) {
	}

	IdUniverso(T_ID_UNIVERSO id) :
		_id(id) {
	}

	virtual ~IdUniverso(){}

	void setId(T_ID_UNIVERSO id) {
		_id = id;
	}

	bool isDefined() {
		return _id != ID_UNDEFINED;
	}

	T_ID_UNIVERSO getId() const {
		return _id;
	}

	/**
	 * Devuelve una cadena que identifica al universo univocamente en el
	 * juego y no contiene caracteres especiales (solo alfanumericos y _)
	 */
	std::string getUid() const
	{
		std::stringstream stm;
		stm << _id;
		return stm.str();
	}

	std::string toString()
	{
		std::stringstream stm;
		stm << _id;
		return stm.str();
	}

	bool operator == (const IdUniverso& otro) const
	{
		return _id == otro._id;
	}

	bool operator != (const IdUniverso& otro) const
	{
		return !(otro == *this);
	}

	bool operator < (const IdUniverso& otro) const
	{
		return _id < otro._id;
	}

	bool operator > (const IdUniverso& otro) const
	{
		return otro < *this;
	}

	void saveToMensaje (aplicacion::t_identificadorFuente& id) const
	{
		id.contenedor = _id;
	}

	void loadFromMensaje (const aplicacion::t_identificadorFuente& id)
	{
		_id = id.contenedor;
	}

private:
	friend std::ostream &operator<<( std::ostream &stream, const IdUniverso &obj );
};

#endif /* IDUNIVERSO_H_ */
